  
  // 定义一个接口来描述返回的对象，包括 debouncedFn 函数和它的 cancel 方法
interface DebouncedFunction<T extends (...args: any[]) => any> {
  debouncedFn: (...args: Parameters<T>) => void;
  cancel: () => void;
}

  /**
   * 创建一个防抖函数。
   * 
   * @param {Function} fn - 需要防抖的函数。
   * @param {number} delay - 防抖延迟时间，单位毫秒。
   * @return {Object} 包含防抖函数和取消函数的对象。
   */
  export function debounce<T extends (...args: any[]) => any>(fn: T, delay: number = 500) :DebouncedFunction<T>{
      let timeout: ReturnType<typeof setTimeout> | null = null;
    
      const debouncedFn = (...args: Parameters<T>) => {
        debouncedFn.cancel();
        timeout = setTimeout(() => fn(...args), delay);
      };
      debouncedFn.cancel = () => {
        if (timeout !== null) {
          clearTimeout(timeout);
          timeout = null;
        }
      };
      return { debouncedFn, cancel: debouncedFn.cancel };
    }
